package examples;

import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

/**
 * 例子思路：
 * 
 * 该示例代码与 java.util.concurrent 中的多个类关联，突出显示了 Future 的功能。它实现缓存，使用 Future
 * 描述缓存值，该值可能已经计算，或者可能在其他线程中"正在构造"。 它利用 ConcurrentHashMap 中的原子 putIfAbsent()
 * 方法，确保仅有一个线程试图计算给定关键字的值。如果其他线程随后请求同一关键字的值，它仅能等待（通过 Future.get()
 * 的帮助）第一个线程完成。因此两个线程不会计算相同的值。
 * 
 * @author yecheng
 * @param <K>
 * 
 */

public class FutureTaskDemo2 {

	ConcurrentMap map = new ConcurrentHashMap();
	Executor executor = Executors.newFixedThreadPool(8);

	public V get(final K key) {
		FutureTask f = map.get(key);
		if (f == null) {
			Callable c = new Callable() {
				public V call() {
					return v;
				}
			};
			f = new FutureTask(c);
			FutureTask old = map.putIfAbsent(key, f);
			if (old == null)
				executor.execute(f);
			else
				f = old;
		}
		return f.get();
	}

}
